package com.ruoyi.system.domain;

import com.ruoyi.common.exception.ServiceException;
import org.apache.poi.ss.usermodel.*;

import java.text.SimpleDateFormat;
import java.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.InputStream;
import java.text.ParseException;

public class DynamicOrderImportUtil {
    private static final Logger log = LoggerFactory.getLogger(DynamicOrderImportUtil.class);


    /**
     * 从动态列Excel中导入订餐数据
     *
     * @param inputStream Excel文件输入流
     * @return 订餐数据列表
     * @throws Exception 导入异常
     */
    public static List<MealOrder> importExcel(InputStream inputStream) throws Exception {
        List<MealOrder> mealOrderList = new ArrayList<>();

        Workbook workbook = null;
        try {
            // 判断Excel版本
            workbook = WorkbookFactory.create(inputStream);

            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);

            if (sheet.getLastRowNum() < 1) {
                throw new ServiceException("Excel文件数据为空");
            }

            // 获取表头行（第1行，索引为0）
            Row headerRow = sheet.getRow(0);

            // 获取数据行，从第2行开始（索引为1）
            int startRow = 1;

            // 解析表头，获取日期列信息
            Map<String, Integer> dateColumnMap = parseDateColumns(headerRow);

            // 解析数据行
            for (int i = startRow; i <= sheet.getLastRowNum(); i++) {
                Row dataRow = sheet.getRow(i);
                if (dataRow == null) {
                    continue;
                }

                // 解析员工基本信息
                Map<String, String> employeeInfo = parseEmployeeInfo(dataRow);

                // 如果电话号码为空，跳过该行
                if (employeeInfo.get("phone") == null || employeeInfo.get("phone").trim().isEmpty()) {
                    continue;
                }

                // 为每个日期列创建订餐记录
                for (Map.Entry<String, Integer> entry : dateColumnMap.entrySet()) {
                    String dateAndMeal = entry.getKey(); // 格式如: 2025-08-11午餐
                    Integer columnIndex = entry.getValue();

                    // 获取该列的值
                    Cell cell = dataRow.getCell(columnIndex);
                    String isOrderedStr = getCellValue(cell);

                    // 解析日期和餐别
                    String[] parts = dateAndMeal.split("(?<=\\d)(?=\\p{IsLetter})|(?<=\\p{IsLetter})(?=\\d)");
                    if (parts.length < 2) {
                        continue;
                    }

                    String dateStr = parts[0];
                    String mealType = parts[1];

                    // 创建订餐记录
                    MealOrder mealOrder = new MealOrder();

                    // 设置用餐日期
                    try {
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        mealOrder.setMealDate(sdf.parse(dateStr));
                    } catch (ParseException e) {
                        log.warn("日期解析失败: {}", dateStr);
                        continue;
                    }

                    // 设置餐别
                    mealOrder.setMealType(mealType);

                    // 设置是否订餐（"是"或"否"转换为1或0）
                    if ("是".equals(isOrderedStr)) {
                        mealOrder.setIsOrdered(1);
                    } else if("否".equals(isOrderedStr)){
                        mealOrder.setIsOrdered(0);
                    }else {
                        // 如果单元格为空或其他值，则设为null表示未填写
                        mealOrder.setIsOrdered(null);
                    }

                    // 保存电话号码和培训名称，供后续处理
                    mealOrder.setRemark(employeeInfo.get("phone") + "|" + employeeInfo.get("trainingName"));

                    mealOrderList.add(mealOrder);
                }
            }
        } finally {
            if (workbook != null) {
                workbook.close();
            }
        }

        return mealOrderList;
    }

    /**
     * 解析表头中的日期列
     *
     * @param headerRow 表头行
     * @return 日期列映射（列名 -> 列索引）
     */
    private static Map<String, Integer> parseDateColumns(Row headerRow) {
        Map<String, Integer> dateColumnMap = new LinkedHashMap<>();

        // 固定列的数量（序号, 培训名称, 培训时间, 姓名, 员工编号, 性别, 部门, 电话, 邮箱）
        int fixedColumnCount = 9;

        // 从第10列开始（索引为9）解析日期列
        for (int i = fixedColumnCount; i < headerRow.getLastCellNum(); i++) {
            Cell cell = headerRow.getCell(i);
            if (cell != null) {
                String columnName = getCellValue(cell);
                if (columnName != null && !columnName.trim().isEmpty() &&
                        (columnName.contains("午餐") || columnName.contains("晚餐"))) {
                    dateColumnMap.put(columnName, i);
                }
            }
        }

        return dateColumnMap;
    }

    /**
     * 解析员工基本信息
     *
     * @param dataRow 数据行
     * @return 员工信息映射
     */
    private static Map<String, String> parseEmployeeInfo(Row dataRow) {
        Map<String, String> employeeInfo = new HashMap<>();

        // 序号（第1列）
        Cell serialNumberCell = dataRow.getCell(0);
        employeeInfo.put("serialNumber", getCellValue(serialNumberCell));

        // 培训名称（第2列）
        Cell trainingNameCell = dataRow.getCell(1);
        employeeInfo.put("trainingName", getCellValue(trainingNameCell));

        // 培训时间（第3列）
        Cell trainingDateCell = dataRow.getCell(2);
        employeeInfo.put("trainingDate", getCellValue(trainingDateCell));

        // 姓名（第4列）
        Cell nameCell = dataRow.getCell(3);
        employeeInfo.put("name", getCellValue(nameCell));

        // 员工编号（第5列）
        Cell employeeNoCell = dataRow.getCell(4);
        employeeInfo.put("employeeNo", getCellValue(employeeNoCell));

        // 性别（第6列）
        Cell sexCell = dataRow.getCell(5);
        employeeInfo.put("sex", getCellValue(sexCell));

        // 部门（第7列）
        Cell deptCell = dataRow.getCell(6);
        employeeInfo.put("dept", getCellValue(deptCell));

        // 电话（第8列）
        Cell phoneCell = dataRow.getCell(7);
        employeeInfo.put("phone", getCellValue(phoneCell));

        // 邮箱（第9列）
        Cell emailCell = dataRow.getCell(8);
        employeeInfo.put("email", getCellValue(emailCell));

        return employeeInfo;
    }

    /**
     * 获取单元格的值
     *
     * @param cell 单元格
     * @return 单元格值
     */
    private static String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    return sdf.format(cell.getDateCellValue());
                } else {
                    return String.valueOf((long) cell.getNumericCellValue());
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                try {
                    return String.valueOf(cell.getNumericCellValue());
                } catch (Exception e) {
                    return cell.getStringCellValue();
                }
            default:
                return "";
        }
    }
}